/// 应用常量定义
/// 包含应用中使用的各种常量值
class AppConstants {
  // 私有构造函数，防止实例化
  AppConstants._();

  // ==================== 应用信息 ====================
  
  /// 应用名称
  static const String appName = 'Cloud Mood';
  
  /// 应用版本
  static const String appVersion = '1.0.0';
  
  /// 应用描述
  static const String appDescription = '情绪记录与疗愈应用 - 记录心情，分析趋势，获得内心平静';
  
  // ==================== 数据库配置 ====================
  
  /// 数据库名称
  static const String databaseName = 'cloud_mood.db';
  
  /// 数据库版本
  static const int databaseVersion = 1;
  
  /// 情绪记录表名
  static const String moodRecordsTable = 'mood_records';
  
  /// 媒体附件表名
  static const String mediaAttachmentsTable = 'media_attachments';
  
  // ==================== 文件路径 ====================
  
  /// 图片存储目录
  static const String imagesDirectory = 'images';
  
  /// 音频存储目录
  static const String audioDirectory = 'audio';
  
  /// 缩略图存储目录
  static const String thumbnailsDirectory = 'thumbnails';
  
  /// 备份存储目录
  static const String backupDirectory = 'backup';
  
  // ==================== 文件限制 ====================
  
  /// 最大图片文件大小（10MB）
  static const int maxImageFileSize = 10 * 1024 * 1024;
  
  /// 最大音频文件大小（50MB）
  static const int maxAudioFileSize = 50 * 1024 * 1024;
  
  /// 最大录音时长（秒）
  static const int maxRecordingDuration = 300; // 5分钟
  
  /// 支持的图片格式
  static const List<String> supportedImageFormats = [
    'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'
  ];
  
  /// 支持的音频格式
  static const List<String> supportedAudioFormats = [
    'mp3', 'wav', 'aac', 'm4a', 'ogg'
  ];
  
  // ==================== 分页配置 ====================
  
  /// 默认分页大小
  static const int defaultPageSize = 20;
  
  /// 历史记录分页大小
  static const int historyPageSize = 15;
  
  /// 搜索结果分页大小
  static const int searchPageSize = 10;
  
  // ==================== 缓存配置 ====================
  
  /// 图片缓存过期时间（天）
  static const int imageCacheExpireDays = 30;
  
  /// 数据缓存过期时间（小时）
  static const int dataCacheExpireHours = 24;
  
  /// 最大缓存文件数量
  static const int maxCacheFiles = 1000;
  
  // ==================== 动画配置 ====================
  
  /// 默认动画时长（毫秒）
  static const int defaultAnimationDuration = 300;
  
  /// 快速动画时长（毫秒）
  static const int fastAnimationDuration = 150;
  
  /// 慢速动画时长（毫秒）
  static const int slowAnimationDuration = 500;
  
  /// 页面切换动画时长（毫秒）
  static const int pageTransitionDuration = 250;
  
  // ==================== 网络配置 ====================
  
  /// 网络请求超时时间（秒）
  static const int networkTimeout = 30;
  
  /// 重试次数
  static const int maxRetryCount = 3;
  
  /// 重试间隔（毫秒）
  static const int retryInterval = 1000;
  
  // ==================== 通知配置 ====================
  
  /// 默认提醒时间（小时）
  static const int defaultReminderHour = 20;
  
  /// 默认提醒时间（分钟）
  static const int defaultReminderMinute = 0;
  
  /// 通知渠道ID
  static const String notificationChannelId = 'mood_reminder';
  
  /// 通知渠道名称
  static const String notificationChannelName = '情绪提醒';
  
  /// 通知渠道描述
  static const String notificationChannelDescription = '每日情绪记录提醒通知';
  
  // ==================== 统计配置 ====================
  
  /// 趋势分析默认天数
  static const int defaultTrendDays = 30;
  
  /// 最小统计记录数
  static const int minStatisticsRecords = 3;
  
  /// 词云最大词数
  static const int maxWordCloudWords = 50;
  
  /// 图表最大数据点数
  static const int maxChartDataPoints = 100;
  
  // ==================== 用户体验配置 ====================
  
  /// 长按触发时间（毫秒）
  static const int longPressDelay = 500;
  
  /// 双击间隔时间（毫秒）
  static const int doubleTapInterval = 300;
  
  /// 滑动阈值（像素）
  static const double swipeThreshold = 100.0;
  
  /// 最小触摸目标大小（像素）
  static const double minTouchTargetSize = 44.0;
  
  // ==================== 文本限制 ====================
  
  /// 日记内容最大长度
  static const int maxDiaryLength = 5000;
  
  /// 标签最大长度
  static const int maxTagLength = 20;
  
  /// 最大标签数量
  static const int maxTagCount = 10;
  
  /// 每条记录最大标签数量
  static const int maxTagsPerRecord = 5;
  
  /// 默认标签列表
  static const List<String> defaultTags = [
    '开心', '难过', '焦虑', '平静', '兴奋',
    '疲惫', '愤怒', '感激', '孤独', '满足',
    '紧张', '放松', '困惑', '自信', '失望'
  ];
  
  /// 天气选项列表
  static const List<String> weatherOptions = [
    '晴天', '多云', '雨天', '雪天', '大风',
    '雾霾', '雷雨', '炎热', '寒冷'
  ];
  
  /// 搜索关键词最大长度
  static const int maxSearchKeywordLength = 100;
  
  // ==================== 默认值 ====================
  
  /// 默认情绪强度
  static const int defaultMoodIntensity = 5;
  
  /// 默认语言代码
  static const String defaultLanguageCode = 'zh';
  
  /// 默认国家代码
  static const String defaultCountryCode = 'CN';
  
  // ==================== 错误消息 ====================
  
  /// 网络错误消息
  static const String networkErrorMessage = '网络连接失败，请检查网络设置';
  
  /// 文件不存在错误消息
  static const String fileNotFoundErrorMessage = '文件不存在或已被删除';
  
  /// 权限拒绝错误消息
  static const String permissionDeniedErrorMessage = '权限被拒绝，请在设置中开启相关权限';
  
  /// 存储空间不足错误消息
  static const String storageFullErrorMessage = '存储空间不足，请清理设备存储空间';
  
  /// 数据库错误消息
  static const String databaseErrorMessage = '数据库操作失败，请重试';
  
  /// 未知错误消息
  static const String unknownErrorMessage = '发生未知错误，请重试';
  
  // ==================== 成功消息 ====================
  
  /// 保存成功消息
  static const String saveSuccessMessage = '保存成功';
  
  /// 删除成功消息
  static const String deleteSuccessMessage = '删除成功';
  
  /// 更新成功消息
  static const String updateSuccessMessage = '更新成功';
  
  /// 导出成功消息
  static const String exportSuccessMessage = '导出成功';
  
  /// 导入成功消息
  static const String importSuccessMessage = '导入成功';
  
  // ==================== 提示消息 ====================
  
  /// 确认删除消息
  static const String confirmDeleteMessage = '确定要删除这条记录吗？此操作无法撤销。';
  
  /// 确认清空消息
  static const String confirmClearMessage = '确定要清空所有数据吗？此操作无法撤销。';
  
  /// 数据为空消息
  static const String noDataMessage = '暂无数据';
  
  /// 搜索无结果消息
  static const String noSearchResultMessage = '未找到相关记录';
  
  /// 网络连接提示
  static const String networkRequiredMessage = '此功能需要网络连接';
  
  // ==================== 正则表达式 ====================
  
  /// 邮箱验证正则
  static const String emailRegex = r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
  
  /// 手机号验证正则（中国）
  static const String phoneRegex = r'^1[3-9]\d{9}$';
  
  /// 标签验证正则（只允许中文、英文、数字）
  static const String tagRegex = r'^[\u4e00-\u9fa5a-zA-Z0-9]+$';
  
  // ==================== 日期格式 ====================
  
  /// 日期格式（年-月-日）
  static const String dateFormat = 'yyyy-MM-dd';
  
  /// 时间格式（时:分）
  static const String timeFormat = 'HH:mm';
  
  /// 日期时间格式（年-月-日 时:分）
  static const String dateTimeFormat = 'yyyy-MM-dd HH:mm';
  
  /// 完整日期时间格式（年-月-日 时:分:秒）
  static const String fullDateTimeFormat = 'yyyy-MM-dd HH:mm:ss';
  
  /// 月份格式（年-月）
  static const String monthFormat = 'yyyy-MM';
  
  /// 年份格式
  static const String yearFormat = 'yyyy';
  
  // ==================== SharedPreferences键名 ====================
  
  /// 主题模式键
  static const String themeKey = 'theme_mode';
  
  /// 语言键
  static const String languageKey = 'language';
  
  /// 通知开关键
  static const String notificationKey = 'notification_enabled';
  
  /// 提醒时间键
  static const String reminderTimeKey = 'reminder_time';
  
  /// 隐私模式键
  static const String privacyModeKey = 'privacy_mode';
  
  /// 自动备份键
  static const String autoBackupKey = 'auto_backup';
  
  /// 首次启动键
  static const String firstLaunchKey = 'first_launch';
  
  /// 用户引导完成键
  static const String onboardingCompletedKey = 'onboarding_completed';
  
  // ==================== 路由名称 ====================
  
  /// 首页路由
  static const String homeRoute = '/home';
  
  /// 记录页面路由
  static const String recordRoute = '/record';
  
  /// 历史页面路由
  static const String historyRoute = '/history';
  
  /// 趋势分析页面路由
  static const String analyticsRoute = '/analytics';
  
  /// 设置页面路由
  static const String settingsRoute = '/settings';
  
  /// 详情页面路由
  static const String detailRoute = '/detail';
  
  /// 编辑页面路由
  static const String editRoute = '/edit';
  
  /// 搜索页面路由
  static const String searchRoute = '/search';
  
  /// 关于页面路由
  static const String aboutRoute = '/about';
  
  /// 隐私政策页面路由
  static const String privacyRoute = '/privacy';
  
  /// 用户协议页面路由
  static const String termsRoute = '/terms';
  
  // ==================== 辅助方法 ====================
  
  /// 检查文件大小是否超限
  /// [fileSize] 文件大小（字节）
  /// [isImage] 是否为图片文件
  /// 返回是否超限
  static bool isFileSizeExceeded(int fileSize, {bool isImage = true}) {
    final maxSize = isImage ? maxImageFileSize : maxAudioFileSize;
    return fileSize > maxSize;
  }
  
  /// 检查文件格式是否支持
  /// [extension] 文件扩展名
  /// [isImage] 是否为图片文件
  /// 返回是否支持
  static bool isSupportedFormat(String extension, {bool isImage = true}) {
    final supportedFormats = isImage ? supportedImageFormats : supportedAudioFormats;
    return supportedFormats.contains(extension.toLowerCase());
  }
  
  /// 格式化文件大小
  /// [bytes] 字节数
  /// 返回格式化后的文件大小字符串
  static String formatFileSize(int bytes) {
    if (bytes < 1024) {
      return '${bytes}B';
    } else if (bytes < 1024 * 1024) {
      return '${(bytes / 1024).toStringAsFixed(1)}KB';
    } else if (bytes < 1024 * 1024 * 1024) {
      return '${(bytes / (1024 * 1024)).toStringAsFixed(1)}MB';
    } else {
      return '${(bytes / (1024 * 1024 * 1024)).toStringAsFixed(1)}GB';
    }
  }
  
  /// 格式化时长
  /// [seconds] 秒数
  /// 返回格式化后的时长字符串（mm:ss）
  static String formatDuration(int seconds) {
    final minutes = seconds ~/ 60;
    final remainingSeconds = seconds % 60;
    return '${minutes.toString().padLeft(2, '0')}:${remainingSeconds.toString().padLeft(2, '0')}';
  }
  
  /// 验证邮箱格式
  /// [email] 邮箱地址
  /// 返回是否为有效邮箱
  static bool isValidEmail(String email) {
    return RegExp(emailRegex).hasMatch(email);
  }
  
  /// 验证手机号格式
  /// [phone] 手机号
  /// 返回是否为有效手机号
  static bool isValidPhone(String phone) {
    return RegExp(phoneRegex).hasMatch(phone);
  }
  
  /// 验证标签格式
  /// [tag] 标签
  /// 返回是否为有效标签
  static bool isValidTag(String tag) {
    return tag.isNotEmpty && 
           tag.length <= maxTagLength && 
           RegExp(tagRegex).hasMatch(tag);
  }
}